package com.shijie.sjoj.model.pojo.base;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.shijie.sjoj.model.base.BasePojo;
import com.shijie.sjoj.model.base.BaseValueEnumSerialize;
import lombok.extern.slf4j.Slf4j;

/**
 * 判题状态枚举类
 *
 * @author ZSJ
 */
@Slf4j
public enum Status implements BaseValueEnumSerialize<Status>, BasePojo {

    /**
     * 已提交
     */
    Commited("Commited"),

    /**
     * 编译中
     */
    Compiling("Compiling"),

    /**
     * 解题成功
     */
    Succeeded("Succeeded"),

    /**
     * 解题失败
     */
    Failed("Failed"),

    /**
     * 默认的实例，应不作为DAO有效值
     */
    Default("N/A"),
    ;

    /**
     * 枚举对象的（内部）值
     */
    private final String value;

    Status(String value) {
        this.value = value;
    }

    // 初始化
    static {
        BaseValueEnumSerialize.InheritDefInstanceRegister.register(Default);
    }

    @Override
    public Status defaultInstance() {
        return Default;
    }

    @Override
    public Status newInstance(String value) {
        return Status.of(value);
    }

    @JsonValue
    @Override
    public String getValue() {
        return this.value;
    }

    /**
     * 从字符串值推断枚举类型
     * <pre>@JsonCreator 指定反序列化时使用的静态方法，枚举类型从Json反序列化的方法</pre>
     *
     * @return Status
     */
    @JsonCreator
    public static Status of(String value) {
        for (Status status : Status.values()) {
            if (status.value.equalsIgnoreCase(value)) {
                return status;
            }
        }
        log.error("从值获取枚举异常，没有该值的枚举：（Status）{}", value);
        return null;
    }


}